#include <iostream>
#include <signal.h>
#include <unistd.h>
using namespace std;
// sigset_t pending;
void Printf(sigset_t pending)
{
	for (int i = 1; i <= 31; i++)
	{
		if (sigismember(&pending, i))
			cout << "1";
		else
		{
			cout << "0";
		}
		if (i % 4 == 0)
			cout << " ";
	}
	cout << endl;
}

void handler(int signo)
{
	std::cout << "get a sig:" << signo << std::endl;
	sleep(1);
	// while (true)
	// {
	// 	sigset_t pending;
	// 	sigpending(&pending);
	// 	Printf(pending);
	// 	sleep(1);
	// }
	// Printf(pending);
	// sleep(5);
	// cout << "get a  signal,signo:" << signo << endl;
}
// int main()
// {
// 	sigset_t block, old;
// 	sigemptyset(&block);
// 	sigemptyset(&old);
// 	for (int i = 1; i <= 31; i++)
// 	{
// 		sigaddset(&block, i);
// 	}
// 	sigprocmask(SIG_SETMASK, &block, &old);

// 	int cnt = 20;
// 	while (cnt--)
// 	{
// 		sigpending(&pending);
// 		Printf(pending);
// 		cout << "mypid:" << getpid() << "..." << endl;
// 		if (cnt == 10)
// 		{
// 			sigprocmask(SIG_SETMASK, &old, nullptr);
// 		}
// 		sleep(1);
// 	}
// 	return 0;
// }

int main()
{
	sigset_t mask, omask;
	sigemptyset(&mask);
	sigemptyset(&omask);

	sigaddset(&mask, 2);
	sigaddset(&mask, 3);
	sigaddset(&mask, 4);
	sigaddset(&mask, 5);

	signal(2,handler);
	signal(3,handler);
	signal(4,handler);
	signal(5,handler);



	sigprocmask(SIG_SETMASK, &mask, &omask);
	// struct sigaction act, oact;
	// sigemptyset(&act.sa_mask);
	// act.sa_handler = handler;

	//sigaction(2, &act, &oact);
	cout << "getpid:" << getpid() << endl;
	int cnt = 20;
	while (true)
	{
		sigset_t pending;
		sigpending(&pending);
		Printf(pending);
		cnt--;
		sleep(1);
		if (cnt == 0)
		{
			sigprocmask(SIG_SETMASK, &omask, nullptr);
			cout << "cancel  2,3,4,5 block" << endl;
		}
	}
	return 0;
}